#ifndef NETLIB_THREAD_H
#define NETLIB_THREAD_H

// 线程类，实现自定义的线程

#include "Atomic.h"
#include "CountDownLatch.h"
#include "Types.h"

#include <functional>
#include <memory>
#include <pthread.h>

namespace netlib
{

/*
Linux进程有唯一标识符pid_t，在每一个进程中，每个线程都有唯一的标识符pthread_t
不同进程中会存在相同pthread_t的线程，pthread_t只在同一进程中起标识作用
每一个线程都有全局标识tid,可以通过系统调用syscall(SYS_gettid)获得
pthread_t由线程库记录维护，tid由内核记录维护
*/

class Thread : noncopyable
{
public:
    typedef std::function<void ()> ThreadFunc;

    explicit Thread(ThreadFunc, const string& name = string());

    ~Thread();

    void start();

    int join();

    bool started() const { return started_; }

    pid_t tid() const { return tid_; }

    const string& name() const { return name_; }

    static int numCreated() { return numCreated_.get(); }

private:
    void setDefaultName();

    bool       started_;                // 线程是否启动
    bool       joined_;                 // 是否调用join
    pthread_t  pthreadId_;              // 在进程中的标识符
    pid_t      tid_;                    // 全局标识符tid
    ThreadFunc func_;                   // 线程入口函数
    string     name_;                   // 线程名称
    CountDownLatch latch_;              // 倒计时同步类
    static AtomicInt32 numCreated_;     // 原子计数类int32_t类型

}; // class Thread end

} // namespace netlib end
#endif